class PollingManager {
  // 计时器ID（兼容浏览器环境）
  private timer: number | null = null;
  // 轮询时间间隔（毫秒）
  private interval: number;
  // 轮询执行的方法（支持任意返回值）
  private pollMethod: () => any | Promise<any>;
  // 是否正在轮询中
  private isPolling: boolean = false;

  /**
   * 构造函数
   * @param interval 轮询时间间隔（毫秒）
   * @param pollMethod 要轮询执行的方法（支持同步/异步，任意返回值）
   */
  constructor(interval: number, pollMethod: () => any | Promise<any>) {
    this.interval = Math.max(100, interval); // 最小100ms
    this.pollMethod = pollMethod;
  }

  /**
   * 启动轮询
   * @param immediate 是否立即执行一次（默认true）
   */
  start(immediate: boolean = true): void {
    if (this.isPolling) {
      this.stop();
    }

    this.isPolling = true;

    const executePoll = async () => {
      if (!this.isPolling) return;

      try {
        // 执行轮询方法（无论返回什么都兼容）
        await this.pollMethod();
        if (this.isPolling) {
          this.timer = window.setTimeout(executePoll, this.interval);
        }
      } catch (error) {
        if (this.isPolling) {
          this.stop();
        }
        console.error("轮询执行出错:", error);
      }
    };

    if (immediate) {
      executePoll();
    } else {
      this.timer = window.setTimeout(executePoll, this.interval);
    }
  }

  /**
   * 停止轮询
   */
  stop(): void {
    if (this.timer) {
      window.clearTimeout(this.timer);
      this.timer = null;
    }
    this.isPolling = false;
  }

  /**
   * 重新设置轮询间隔
   */
  setInterval(interval: number): void {
    const newInterval = Math.max(100, interval);
    if (newInterval !== this.interval) {
      this.interval = newInterval;
      if (this.isPolling) {
        this.start(false);
      }
    }
  }

  /**
   * 检查是否正在轮询中
   */
  isRunning(): boolean {
    return this.isPolling;
  }

  /**
   * 销毁资源
   */
  destroy(): void {
    this.stop();
    this.pollMethod = () => {};
  }
}

export default PollingManager;
